home *** CD-ROM | disk | FTP | other *** search
/ ADA Programming Guide / ADA Programming Guide.iso / ada_gwu / adaed / gwudemos / parser.ada < prev    next >
Encoding:
Text File  |  1996-01-30  |  3.0 KB  |  139 lines

  1. --
  2. --    Program : Parser.ada
  3. --    Purpose : This program implements a recursive descent parser.  It is
  4. --      based on the recursive descent parser given in Aho, Sethi,
  5. --      and Ullman, "Principles, Techniques and Tools", 
  6. --      Addison-Wesley, 1986.  Note that symbols are limited to
  7. --      a single character.
  8. --
  9. --    To use with GWUMON : To use this program with GWUMON, from the command
  10. --              line type:
  11. --                       adacomp -a -b -mparse_expr parser.ada
  12. --                       gwumon -mparse_expr
  13. --
  14. --    Take the default options on the first screen (speed = 6, exceptions = yes,
  15. --              and tasks = no) by hitting the "Esc" key.  Take the defaults
  16. --      on the second screen by hitting the "Esc" key.
  17. --
  18. --    The purpose of this program is to show recursion, and how in showing that
  19. --    recursion the parse tree can be represented.
  20. --
  21. WITH Text_IO; USE Text_IO;
  22. PACKAGE Parser IS
  23.   PROCEDURE Parse;
  24. END;
  25.  
  26. PACKAGE BODY Parser IS
  27.  
  28.   Token : Character;
  29.   Token_Type : Character;
  30.  
  31.   -- "forward" declarations to accommodate mutual recursion
  32.   
  33.   PROCEDURE Lex;
  34.   PROCEDURE Expr;
  35.   PROCEDURE Factor;
  36.   PROCEDURE Term;
  37.         
  38.   PROCEDURE Parse IS
  39.   BEGIN
  40.     Lex;
  41.     Expr;
  42.   END Parse;
  43.     
  44.   PROCEDURE Lex IS
  45.   BEGIN
  46.     LOOP
  47.       IF NOT End_Of_Line THEN
  48.         GET( Token );
  49.         IF Token /= ' ' THEN
  50.           CASE Token IS
  51.             WHEN '+' | '-' =>
  52.               Token_Type := 'A';
  53.             WHEN '*' | '/' =>
  54.               Token_Type := 'M';
  55.             WHEN OTHERS =>
  56.               Token_Type := 'I';
  57.           END CASE;
  58.           EXIT;
  59.         END IF;
  60.       ELSE
  61.         Token_Type := ' ';
  62.         Token := ' ';
  63.         EXIT;
  64.       END IF;
  65.     END LOOP;
  66.   END Lex;
  67.  
  68.   PROCEDURE Expr IS
  69.     Save_Token : Character;
  70.   BEGIN
  71.     Term;
  72.     LOOP
  73.       IF Token = '+' OR Token = '-' THEN
  74.         Save_Token := Token;
  75.         Lex;
  76.         Term;
  77.         Put( Save_Token );        
  78.       ELSE
  79.         EXIT;
  80.       END IF;
  81.     END LOOP;
  82.   END Expr;
  83.  
  84.   PROCEDURE Term IS
  85.     Save_Token : Character;
  86.   BEGIN
  87.     Factor;
  88.     LOOP
  89.       IF Token = '*' OR Token = '/' THEN
  90.         Save_Token := Token;
  91.         Lex;
  92.         Factor;
  93.         Put( Save_Token );
  94.       ELSE
  95.         EXIT;
  96.       END IF;
  97.     END LOOP;
  98.   END Term;
  99.  
  100.   PROCEDURE Factor IS
  101.     Save_Token : Character;
  102.   BEGIN
  103.     IF Token = '(' THEN
  104.       Lex;
  105.       Expr;
  106.       IF Token /= ')' THEN
  107.         Put_Line(" ");
  108.         Put_Line( "Error, ')' expected, tossing token" );
  109.       ELSE
  110.         Lex;
  111.       END IF;
  112.     ELSE 
  113.       IF Token_Type = 'I' THEN
  114.         Put( Token );
  115.         Lex;
  116.       ELSE
  117.         Put_Line(" ");
  118.         Put( "Error, identifier expected, got ");
  119.         Put( Token );
  120.         New_Line;
  121.       END IF;
  122.     END IF;
  123.  
  124.   END Factor;
  125.  
  126. END Parser;
  127.  
  128.  
  129. WITH Text_IO; USE Text_IO;
  130. WITH Parser; USE Parser;
  131. PROCEDURE Parse_Expr IS
  132. BEGIN
  133.  
  134.   Put_Line( "Enter an expression to be parsed >" );
  135.   Parse;
  136.  
  137. END Parse_Expr;
  138.  
  139.